(以下文章擷取自筆者的 blog,分享給大家)
在資料庫的備援部份,採用 SQL Server Log-shipping 方式來處理,希望在移轉至 MariaDB 時也有不錯的類似 Log-shipping 方式執行。
接下來的文章來自於許多的文件,從官方文件,MariaDB · 版本特性 · MariaDB 的 GTID 介绍,還有mariadb10 GTID 研究笔记. md與實作,整理了一下。
與 SQL Server Log-shipping 不一樣的地方如下
在 4 的部份,其實對於現在的維運有些麻煩。因為這 15 分鐘的落差,可以拿來利用成正式環境的 buffer,下錯指令時如果還在 15 分鐘的時間分隔下,還可以趕快去備援區拿資料蓋回去,現在沒有時間設定的話就比較麻煩。有人發個 issue 希望能 merge MySQL 的 MASTER_DELAY 功能,不過表定是 10.2.x 的功能,希望能實作在 10.1.x。
在 5 的部份筆者覺得還蠻方便的就是帳號密碼的同步,在 SQL Server Log-shipping 是要分開想辦法同步的,管理就很方便了。
GTID 的規格部份就不解釋了,上面的文件寫的很清楚。
在 MariaDB 有一些 Server Variables 紀錄 GTID 的資訊
| Server Variables Names | 意義 |
|---|---|
gtid_binlog_pos |
binlog 裡最後一筆紀錄的 GTID |
gtid_slave_pos |
Slave 上紀錄的最後一個 binlog GTID |
gtid_current_pos |
Database 上紀錄的最後一個 binlog GTID |
什麼叫作 "紀錄的最後一個 binlog GTID" 呢?
對 gtid_slave_pos 來說,就是 master 的最後一筆 GTID。
對 gtid_current_pos 來說,不管當下的 Instance 之前是 Master 還是 Slave
if gtid_binlog_pos.ServerID = Instance.ServerID and gtid_binlog_pos.DomainID = Instance.DomainID and gtid_binlog_pos.SequenceID > gtid_slave_pos.SequenceID (同 ServerID 與 DomainID 狀態下) then
gtid_current_pos = gtid_binlog_pos
else
gtid_current_pos = gtid_slave_pos (同 ServerID 與 DomainID 狀態下)
end if
官方文件有說到一個例子,假設 A 為 Master,B 為 Slave,參數為 slave_pos,把 A 先關一會兒,讓 B 成為 Master,最後回復 A 並成為 B 的 Slave。

gtid_binlog_pos 與 gtid_current_pos 相同(1-1-123, 1-1-137, 1-1-145),gtid_slave_pos 是空值。gtid_slave_pos 記著 A 的最後一個 GTID。1-1-145 的時候把 A 先關掉,中間 B 的修改先忽略不看(假設沒發生),現在資料庫停在 1-1-145。gtid_slave_pos 是空值,所以設成 current_pos (就是 1-1-145)。1-1-147 的時候,最新的就是 1-1-147,B 就知道怎麼恢復了 (145-147),正式加成 A 的 Slave。這個的假設前提是在那個中斷時間內沒 B 沒有任何的 binlog 紀錄交易,這樣能確保 1-1-145 到 1-1-147 都只有在有 Slave 的狀態下 Master 產生的交易,假設 B 中間原來忽略的的 2-2-138 被產生了,那麼 binlog 的順序就會在 1-1-145 與 1-1-147 中間夾一個 2-2-138,奇怪的交易紀錄,會導致 A 的加入失敗。
所以官方建議在 Slave 上不要有任何的 binlog 紀錄 (Session 中 @@sql_log_bin=0),避免當這個 Slave 有機會變成 Master 或是再 Slave 到其他地方時有交易紀錄異常的問題。
如果還是要修改 Slave 的資料造成 binlog 會有變動,還是要把參數設為 slave_pos,確保 Slave 會從 Master 看的 binlog 資料不會因為 Slave 的變動而異常,不能像 current_pos 那樣兩邊都有可能取值,不管是什麼角色。
在 B 當 Slave 的時候如果沒有開 binlog,那麼 current_pos 與 slave_pos 是同一件事,當然後續的切換是不會發生的 (B 沒 binlog 不能當 Master)。
剛剛最後有說到在 Slave 沒有開 binlog 的方式,筆者原來是想要用這個的,因為這蠻像現在的維運模式。
如果 Slave 有開 binlog,第2步的停機備份似乎可以把時間縮短
明天要介紹的是測試與實作碰到的問題。